package com.itlaobing.proxy.dynamic;

import java.lang.reflect.*;
import java.util.Arrays;

public class Test3 {

    public static void main(String[] args) {

        //获得 代理目标（proxy target）
        HuaWei target = new Factory();

        Class<?> targetClass = target.getClass();
        ClassLoader loader = targetClass.getClassLoader();

        Class<?>[] interfaces = targetClass.getInterfaces();

        InvocationHandler handler = new InvocationHandler() {
            /**
             * 将方法调用指派给代理目标
             * @param proxy 表示代理对象 ( 在invoke方法中不要通过proxy调用任何方法以避免递归调用 )
             * @param method 表示被调用的方法 (用户通过代理对象调用的方法)
             * @param args 用户通过代理对象调用方法时传入的参数列表
             * @return
             * @throws Throwable
             */
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                String name = method.getName();
                System.out.println( "【" + name + "】即将执行");
                // 调用 target 的 method 方法 ( 为其 传入参数 并 获得返回值)
                Object result = method.invoke(target , args);
                System.out.println( "【" + name + "】执行结束");
                return result;
            }
        };
        // 创建代理对象(proxy object)
        // 第一个参数 loader 表示类加载器，确定用来加载动态代理类的类加载器
        // 第二个参数 interfaces 表示将来动态产生的类需要直接实现的接口
        // 第三个参数 handler 用来完成方法调用的指派操作
        Object proxy = Proxy.newProxyInstance( loader , interfaces , handler);
        String s = proxy.toString();
        System.out.println(s);

        System.out.println( "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -" );

        if( proxy instanceof HuaWei ) {
            HuaWei huaWei = (HuaWei)proxy ;
            Phone p = huaWei.produce();
            System.out.println( p.getBrand() );
        }

    }
}
